<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title></title>
</head>
<body>
<!-- 这里是样式 -->
<!-- number  string Boolanl 三个 强制转换的底层原理 -->
<!-- jjj -->
<!-- number string Boolanl  都会自转换为自己想要的 比如 -->

</body>
</html>
<script>
// 这里是逻辑
Number(222)//222
Number({})//nan
Number(true)//转换为number
//  只可以转换单个数值 不能转换 对象啊 之类的
Number({
    valueOf:function(){
        return 2//如果这里是个空就会报错 必须要有数值
    }

})
Number({
    toString:function(){
        return 3 // 这样就会正确
    }
})
toString({
    toString:function(){
        return 3// 返回的是函数的的字符串
    }
})
// valueOf  会返回本身 
// toString 就是本身转换为字符串
//  String  函数可以将任何任意类型转换为字符串 转换规则下
//  数值 转换后为字符串
//  字符串 转换后还是原来的值
//  布尔值 true 转换为字符串 false 转换为字符串 false
//  undefined 转换之后还是undefined 
// null 转换之后还是null
String(123);
String('abb');
String(true);


// String 转换之后 是对象 [object object ]
//  与number 转换的规则是一样的 只是换了一下顺序
// String方法背后的转换规则，与Number方法基本相同，只是互换了valueOf方法和toString方法的执行顺序。

// 先调用对象自身的toString方法。如果返回原始类型的值，则对该值使用String函数，不再进行以下步骤。

// 如果toString方法返回的是对象，再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值，则对该值使用String函数，不再进行以下步骤。

// 如果valueOf方法返回的是对象，就报错。


Boolean()函数可以将任意类型的值转为布尔值。

它的转换规则相对简单：除了以下五个值的转换结果为false，其他的值全部为true。

undefined
null
0（包含-0和+0）
NaN
''（空字符串）
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
当然，true和false这两个布尔值不会发生变化。

Boolean(true) // true
Boolean(false) // false
注意，所有对象（包括空对象）的转换结果都是true，甚至连false对应的布尔对象new Boolean(false)也是true（详见《原始类型值的包装对象》一章）。

Boolean({}) // true
Boolean([]) // true
Boolean(new Boolean(false)) // true
所有对象的布尔值都是true，这是因为 JavaScript 语言设计的时候，出于性能的考虑，如果对象需要计算才能得到布尔值，对于obj1 && obj2这样的场景，可能会需要较多的计算。为了保证性能，就统一规定，对象的布尔值为true。




// 自动转换的 对于用户是不可以见到的 
 123+'abc';
//  第二种
if('abc){
    console.log('hello');
}
// 第三种
+{foo:"bar"}






















</script>